﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.MobileControls;
using IrendilDLL;
using Irendil.controls;
using IrendilDLL.Database;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using IrendilDLL.PageControls;
using AjaxControlToolkit;
using IrendilDLL.utilities;

namespace Irendil
{
    public partial class MonitorSP : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                // Procedo solo se é correttamente inizializzata la variabile di sessione
                String installationGUID = (String)Session["installationGUID"];
                if (installationGUID != "" || installationGUID != String.Empty)
                {
                    // Recupero le informazioni relativa al nodo dell'installazione selezionato
                    List<InstallationNode> installationNodeList = (List<InstallationNode>)Session["installationNodeList"];
                    InstallationNode installationNodeActive = null;
                    foreach (InstallationNode installationNode in installationNodeList)
                    {
                        if (installationNode.GUID == installationGUID)
                            installationNodeActive = installationNode;
                    }
                    // Se come devo trovo il nodo attivo vado avanti
                    if (installationNodeActive != null)
                    {
                        // Istanzio la classe di controllo


                        if (!IsPostBack)
                        {

                            System.Web.UI.WebControls.Label labelMessageOut = (System.Web.UI.WebControls.Label)Master.Master.FindControl("LabelMessageOut");
                            labelMessageOut.Text = "Connesso a <b>" + installationNodeActive.Description+"</b>";

                            // Imposto le date di default nel filterBar
                            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
                            filterBar.setFromDate(System.DateTime.Now);
                            filterBar.setToDate(System.DateTime.Now);
                            // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in postbak)
                            filterBar.SearchButton.Click += new EventHandler(this.searchButton_Click);

                            // Ottengo la stringa di connessione al db
                            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

                            // Ottengo il riferimento alla executeBar
                            executeBar executeBar = (executeBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("executeBar");

                            // Istanzio la classe di appoggio al DB Irendil
                            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
                            irendilDbManager.populateHostsDropDownList(filterBar.getHostDropDownList(), installationGUID);
                            irendilDbManager.populateSPDropDownList(executeBar.getActionDropDownList(), installationGUID);

                            // Ottengo e visualizzo gli eventi prelevati da DB
                            getAndViewDbData(filterBar, localSqlServerStr);


                        }

                        if (IsPostBack)
                        {
                            // Ottengo il riferimento a filterBar
                            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
                            // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in !postbak)
                            filterBar.SearchButton.Click += new EventHandler(this.searchButton_Click);

                            // Ottengo il riferimento alla executeBar
                            executeBar executeBar = (executeBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("executeBar");
                            // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in !postbak)
                            executeBar.ExecuteButton.Click += new EventHandler(this.executeButton_Click);

                            //// Ottengo la stringa di connessione al db
                            //string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                            //// Ottengo e visualizzo gli eventi prelevati da DB
                            //getAndViewDbData(filterBar, localSqlServerStr);
                        }

                    }


                }

            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // In caso di sessione scaduta o altro redirigo alla pagina di login
                Response.Redirect("~//Logout.aspx");
            }
        }

        /// <summary>
        /// Metodo che preleva da DB gli eventi e li visualizza opportunamente
        /// </summary>
        /// <param name="filterBar">rif alla barra di filtraggio</param>
        /// <param name="localSqlServerStr">rif alla stringa di connessione al DB</param>
        private void getAndViewDbData(filterBar filterBar, string localSqlServerStr)
        {
            // Prelevo i dati da DB
            try
            {
                // Ottengo l'host selezionato
                String spSelected = filterBar.getHostDropDownList().SelectedValue;


                // Istanzio la classe di controllo
                MonitorSPControl monitorSPControl = new MonitorSPControl();
                DataTable dt = monitorSPControl.getStoreLogDT(spSelected, filterBar.getFromDate(), filterBar.getToDate());

                //// Salvo i dati in cache per evitare troppi round-trip su DB
                //Cache["DataTable"] = dt;
                // Imposto la sorgente dati
                monitorSPGridView.DataSource = dt;
                // Eseguo il bind dei dati (visualizzazione)
                monitorSPGridView.DataBind();
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();

            }
        }

        /// <summary>
        /// Evento associato alla pressione del tasto search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void searchButton_Click(object sender, EventArgs e)
        {
            // Ottengo il riferimento a filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);
        }


        /// <summary>
        /// Evento associato al cambio pagina nella gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void monitorSPGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //// Imposto il nuovo valore di pagina
            //monitorSPGridView.PageIndex = e.NewPageIndex;
            //// Prelevo da cache il DT
            //monitorSPGridView.DataSource = (DataTable)Cache["DataTable"];
            //// Effetto la visualizzazione dei dati
            //monitorSPGridView.DataBind();

            // Imposto le date di default nel filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);

            monitorSPGridView.PageIndex = e.NewPageIndex;
            monitorSPGridView.DataBind();
        }

        /// <summary>
        /// Evento associato alla pressione del tasto Esegui
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void executeButton_Click(object sender, EventArgs e)
        {
            try
            {

                // Ottengo il riferimento alla executeBar e filterBar
                filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
                executeBar executeBar = (executeBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("executeBar");

                String storeSelected = "";
                String hostSelected = "";
                // Ottengo i valori impostati
                hostSelected = ((DropDownList)(filterBar.getHostDropDownList())).SelectedValue;
                storeSelected = ((DropDownList)(executeBar.getActionDropDownList())).SelectedValue;

                // Devo eseguire il codice solo se é stata selezionata correttamente una store procedure
                if (storeSelected != null && storeSelected != "")
                {
                    // Attualmente l'import dello stato dischi non é gestito tramite SP pertanto gestisco il caso a parte
                    // TODO
                    if (storeSelected == "sp_importDisks")
                    {
                        // Istanzio la classe di controllo
                        MonitorSPControl monitorSPControl = new MonitorSPControl();
                        monitorSPControl.WarningThreshold = 10;
                        monitorSPControl.AlertThreshold = 5;
                        monitorSPControl.executeImportDiskWMI();
                    }
                    else
                    {
                        // Istanzio la classe di controllo
                        MonitorSPControl monitorSPControl = new MonitorSPControl();
                        monitorSPControl.executeImportSP(storeSelected, hostSelected); 
                    }

                    // Ottengo la stringa di connessione al db
                    string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                    // Aggiorno e visualizzo gli eventi prelevati da DB
                    getAndViewDbData(filterBar, localSqlServerStr);
                }
                


            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();

            }

        }
    }
}